#include <Adafruit_NeoPixel.h>
// Arduino program til at sætte lys i LEDs på kontroltavle ved hjælp af I2C og NeoPixels.
// Programmeret af Bo Holmqvist, fra modeljernbaneklubben "Jernhesten".
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
// Hvilket ben på Arduino er tilsluttet NeoPixels LEDs?
// SpSk-S = 1
#define PIN1 2 // 2
// SpSk-N = 2
#define PIN2 3
// Sign-S = 3
#define PIN3 4 // 4
// Sign-N = 4
#define PIN4 5
// Hvor mange RGB Leds er tilsluttet Arduino? (Ikke individuelle LEDs, som vi egentligt bruger
// Der er tre individuelle LEDs per RGB LED (RGB = Red-Green-Blue)
// Der går to LEDs til et sporskifte. Signaler har større variation. Til tavlen dog kun rød/grøn og ranger.
// Udlæs til rigtig port. SpSk er 1 og 2. Signaler er 3 og 4
// 1 = Syd, SpSk SpSk fra 1 til 50
// 2 = Nord, SpSk SpSk fra 51 til 150
// 3 = Syd, Signaler Signalnr fra 1 til 100
// 4 = Nord, Signaler Signalnr fra 101 til 200
// SpSk-S = 1
#define NUMPIXELS1 30 // 30 3 x 30 = 90
// SpSk-N = 2
#define NUMPIXELS2 48 // 48 3 x 48 = 144
// Sign-S = 3
#define NUMPIXELS3 33 // 36 3 x 33 = 99 max 38 31
// Sign-N = 4
#define NUMPIXELS4 53 // 53 3 x 53 = 159
// 500
// Assign NeoPíxels
// SpSk-S = 1
Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(NUMPIXELS1, PIN1, NEO_GRB + NEO_KHZ800);
// SpSk-S = 2
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(NUMPIXELS2, PIN2, NEO_GRB + NEO_KHZ800);
// SpSk-S = 3
Adafruit_NeoPixel pixels3 = Adafruit_NeoPixel(NUMPIXELS3, PIN3, NEO_GRB + NEO_KHZ800);
// SpSk-S = 4
Adafruit_NeoPixel pixels4 = Adafruit_NeoPixel(NUMPIXELS4, PIN4, NEO_GRB + NEO_KHZ800);
// I2C adresse
#define SLAVE_ADDRESS 0x12
// Angiv, hvor kraftigt LEDerne skal lyse - en for hver farve.
// Dette er flyttet til hovedprogrammet, Kastdorf.pas.
#define Lysstyrke_R 120;
#define Lysstyrke_Gr 80;
#define Lysstyrke_Gul 100;
#define Lystyrke_Hv 80;
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
// Dette initialiserer NeoPixel library.
pixels1.begin();
pixels2.begin();
pixels3.begin();
pixels4.begin();
pinMode(13, OUTPUT);
Serial.begin(115200); // start serial for output
// Initialiserer i2c som slave
Wire.begin(SLAVE_ADDRESS);
// Definerer callbacks for i2c kommunication
Wire.onReceive(receiveData);
Serial.println("Ready!");
}
void loop() {
}
// re-add when working raspberry pi code
// callback for received data
void receiveData(int byteCount) {
byte x = 0;
byte i = 1;
byte R[5] = { 0, 0, 0, 0, 0 };
byte UdTil = 0;
byte Nummer = 0;
byte LED1 = 0;
byte LED2 = 0;
byte LED3 = 0;
byte LED4 = 0;
byte Stilling = 0;
byte SignalType = 0;
Serial.println();
Serial.print("data received: ");
// Serial.print(R[i]);
while (Wire.available()) {
R[i] = Wire.read();
Serial.print(i);
Serial.print(": ");
// Serial.print("data received: ");
Serial.print(R[i]);
Serial.print(" ");
i++;
}
Serial.println();
// Input: 1: SpSk eller Signal, 2: Nummer, 3: Stilling 4: SignalType
// R[1] R[2] R[3] R[4]
// SpSk N/S: 1 , Signal N/S: 2 Nummer 2=ligeud, 1=afvig, 0=slukket, 3=Alle tændt 2 lamper, 4 lamper
UdTil = R[1];
Nummer = R[2];
x = R[2];
Stilling = R[3];
SignalType = R[4];
byte Udgang = 0;
if (R[1] == 1) {
if ((x >= 1) && (x <= 50)) { Udgang = 1; } // Case 1, Udgang
if ((x >= 51) && (x <= 150)) {
Udgang = 2;
x = x - 50;
} // Case 2, Udgang
}
if (R[1] == 2) {
if (((x >= 1) && (x <= 50))) { Udgang = 3; } // Case 3, Udgang
if (((x >= 51) && (x <= 150))) {
Udgang = 4;
x = x - 50;
} // Case 4, Udgang
}
byte RGBLED = ((int)(((2 * x - 1) - 1) / 3));
byte RGB1 = ((((2 * x) - 1) - 1) % 3) + 1;
byte RGB2 = (((2 * x) - 1) % 3) + 1;
// Til at læse fra LED. x er lig LED nummer startende med nul som den første LED
// Til SpSk
byte SpSk_LEDS_current_1_1 = (pixels1.getPixelColor(RGBLED) >> 8) & 0xff; // Red
byte SpSk_LEDS_current_1_2 = (pixels1.getPixelColor(RGBLED) >> 16) & 0xff; // Green
byte SpSk_LEDS_current_1_3 = (pixels1.getPixelColor(RGBLED)) & 0xff; // Blue
byte SpSk_LEDS_post_1_1 = (pixels1.getPixelColor(RGBLED + 1) >> 8) & 0xff; // Red
byte SpSk_LEDS_post_1_2 = (pixels1.getPixelColor(RGBLED + 1) >> 16) & 0xff; // Green
byte SpSk_LEDS_post_1_3 = (pixels1.getPixelColor(RGBLED + 1)) & 0xff; // Blue
byte SpSk_LEDS_current_2_1 = (pixels2.getPixelColor(RGBLED) >> 8) & 0xff; // Red
byte SpSk_LEDS_current_2_2 = (pixels2.getPixelColor(RGBLED) >> 16) & 0xff; // Green
byte SpSk_LEDS_current_2_3 = (pixels2.getPixelColor(RGBLED)) & 0xff; // Blue
byte SpSk_LEDS_post_2_1 = (pixels2.getPixelColor(RGBLED + 1) >> 8) & 0xff; // Red
byte SpSk_LEDS_post_2_2 = (pixels2.getPixelColor(RGBLED + 1) >> 16) & 0xff; // Green
byte SpSk_LEDS_post_2_3 = (pixels2.getPixelColor(RGBLED + 1)) & 0xff; // Blue
// til Signaler
byte Signal_LEDS_current_1_1 = (pixels3.getPixelColor(RGBLED) >> 8) & 0xff; // Red
byte Signal_LEDS_current_1_2 = (pixels3.getPixelColor(RGBLED) >> 16) & 0xff; // Green
byte Signal_LEDS_current_1_3 = (pixels3.getPixelColor(RGBLED)) & 0xff; // Blue
byte Signal_LEDS_post_1_1 = (pixels3.getPixelColor(RGBLED + 1) >> 8) & 0xff; // Red
byte Signal_LEDS_post_1_2 = (pixels3.getPixelColor(RGBLED + 1) >> 16) & 0xff; // Green
byte Signal_LEDS_post_1_3 = (pixels3.getPixelColor(RGBLED + 1)) & 0xff; // Blue
// byte Signal_LEDS_current_2_1 = (pixels4.getPixelColor(RGBLED) >> 8) & 0xff; // Red
// byte Signal_LEDS_current_2_2 = (pixels4.getPixelColor(RGBLED) >> 16) & 0xff; // Green
// byte Signal_LEDS_current_2_3 = (pixels4.getPixelColor(RGBLED)) & 0xff; // Blue
// byte Signal_LEDS_post_2_1 = (pixels4.getPixelColor(RGBLED + 1) >> 8) & 0xff; // Red
// byte Signal_LEDS_post_2_2 = (pixels4.getPixelColor(RGBLED + 1) >> 16) & 0xff; // Green
// byte Signal_LEDS_post_2_3 = (pixels4.getPixelColor(RGBLED + 1)) & 0xff; // Blue
if (R[1] == 1) {
// 1=closed(green), 0=thrown(red)
switch (Stilling) {
case 0: // Intet lys
LED1 = 0;
LED2 = 0;
break;
case 1: // Ligeud
LED1 = Lysstyrke_Gul;
LED2 = 0;
break;
case 2: // Afvig
LED1 = 0;
LED2 = Lysstyrke_Gul;
break;
case 3: // Div, test
LED1 = Lysstyrke_Gul;
LED2 = Lysstyrke_Gul;
break;
}
}
if (R[1] == 2) {
switch (Stilling) {
case 0: // Rødt signal
LED1 = Lysstyrke_R;
LED2 = 0;
LED3 = 0;
LED4 = 0;
break;
case 1: // Grønt signal
LED1 = 0;
LED2 = Lysstyrke_Gr;
LED3 = 0;
LED4 = 0;
break;
case 2: // Rangering tilladt
LED1 = 0;
LED2 = 0;
LED3 = Lystyrke_Hv;
LED4 = 0;
break;
case 3: // Ekstra
LED1 = 0;
LED2 = 0;
LED3 = Lystyrke_Hv;
LED4 = Lystyrke_Hv;
break;
}
}
switch (Udgang) {
// SpSk-S begynd
case 1:
switch (RGB1) {
case 1:
pixels1.setPixelColor(RGBLED, LED2, LED1, SpSk_LEDS_current_1_3);
break;
case 2:
pixels1.setPixelColor(RGBLED, LED1, SpSk_LEDS_current_1_1, LED2);
break;
case 3:
pixels1.setPixelColor(RGBLED, SpSk_LEDS_current_1_2, SpSk_LEDS_current_1_1, LED1);
pixels1.setPixelColor(RGBLED + 1, SpSk_LEDS_post_1_2, LED2, SpSk_LEDS_post_1_3);
break;
}
pixels1.show();
break;
// SpSk-S slut
// SpSk-N begynd
case 2:
switch (RGB1) {
case 1:
pixels2.setPixelColor(RGBLED, LED2, LED1, SpSk_LEDS_current_2_3);
break;
case 2:
pixels2.setPixelColor(RGBLED, LED1, SpSk_LEDS_current_2_1, LED2);
break;
case 3:
pixels2.setPixelColor(RGBLED, SpSk_LEDS_current_2_2, SpSk_LEDS_current_2_1, LED1);
pixels2.setPixelColor(RGBLED + 1, SpSk_LEDS_post_2_2, LED2, SpSk_LEDS_post_2_3);
break;
}
pixels2.show();
break;
// SpSk-N slut
// Signal-S
case 3:
switch (RGB1) { //SignalType2 = 2 / SignalType4 = 4
case 1:
// SignalType = 2
if (SignalType == 2) {
pixels3.setPixelColor(RGBLED, LED2, LED1, Signal_LEDS_current_1_3);
}
// SignalType = 4
if (SignalType == 4) {
pixels3.setPixelColor(RGBLED, LED2, LED1, LED3);
pixels3.setPixelColor(RGBLED, Signal_LEDS_current_1_2, LED4, Signal_LEDS_current_1_3);
}
break;
case 2:
// SignalType = 2
if (SignalType == 2) {
pixels3.setPixelColor(RGBLED, LED1, Signal_LEDS_current_1_1, LED2);
}
// SignalType = 4
if (SignalType == 4) {
pixels3.setPixelColor(RGBLED, LED1, Signal_LEDS_current_1_1, LED2);
pixels3.setPixelColor(RGBLED, LED4, LED3, Signal_LEDS_post_1_3);
}
break;
case 3:
// SignalType = 2
if (SignalType == 2) {
pixels3.setPixelColor(RGBLED, Signal_LEDS_current_1_2, Signal_LEDS_current_1_1, LED1);
pixels3.setPixelColor(RGBLED + 1, Signal_LEDS_post_1_2, LED2, Signal_LEDS_post_1_3);
}
// SignalType = 4
if (SignalType == 4) {
pixels3.setPixelColor(RGBLED, Signal_LEDS_current_1_2, Signal_LEDS_current_1_1, LED1);
pixels3.setPixelColor(RGBLED + 1, LED3, LED2, LED4);
}
break;
}
pixels3.show();
break;
// Signal-S
// Signal-N
case 4:
switch (RGB1) { //SignalType2 = 2 / SignalType4 = 4
case 1:
// SignalType = 2
if (SignalType == 2) {
pixels4.setPixelColor(RGBLED, LED2, LED1, Signal_LEDS_current_1_3);
}
// SignalType = 4
if (SignalType == 4) {
pixels4.setPixelColor(RGBLED, LED2, LED1, LED3);
pixels4.setPixelColor(RGBLED, Signal_LEDS_current_1_2, LED4, Signal_LEDS_current_1_3);
}
break;
case 2:
// SignalType = 2
if (SignalType == 2) {
pixels4.setPixelColor(RGBLED, LED1, Signal_LEDS_current_1_1, LED2);
}
// SignalType = 4
if (SignalType == 4) {
pixels4.setPixelColor(RGBLED, LED1, Signal_LEDS_current_1_1, LED2);
pixels4.setPixelColor(RGBLED, LED4, LED3, Signal_LEDS_post_1_3);
}
break;
case 3:
// SignalType = 2
if (SignalType == 2) {
pixels4.setPixelColor(RGBLED, Signal_LEDS_current_1_2, Signal_LEDS_current_1_1, LED1);
pixels4.setPixelColor(RGBLED + 1, Signal_LEDS_post_1_2, LED2, Signal_LEDS_post_1_3);
}
// SignalType = 4
if (SignalType == 4) {
pixels4.setPixelColor(RGBLED, Signal_LEDS_current_1_2, Signal_LEDS_current_1_1, LED1);
pixels4.setPixelColor(RGBLED + 1, LED3, LED2, LED4);
}
break;
}
pixels4.show();
break;
// Signal-N
}
}
|